package cn.lingyangwl.agile.infra.module.dict;

import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import cn.hutool.core.collection.CollUtil;
import cn.lingyangwl.agile.infra.module.dict.model.entity.DictItem;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 支持字典参数设置
 * 举例： @Excel(name = "性别", width = 15, dicCode = "sex")
 * 1、导出的时候会根据字典配置，把值1,2翻译成：男、女;
 * 2、导入的时候，会把男、女翻译成1,2存进数据库;
 * @author shenguangyang
 */
@Slf4j
@Component
@SuppressWarnings("all")
public class ExcelDictHandler implements IExcelDictHandler {
    @Resource
    private DictItemApi dictItemApi;

    @Override
    public List<Map> getList(String dict) {
        List<DictItem> dictItems = dictItemApi.listDictItem(dict);
        if (CollUtil.isEmpty(dictItems)) {
            return Collections.emptyList();
        }
        return dictItemApi.listDictItem(dict).stream()
            .map(e -> {
                Map<String, String> map = new HashMap<>();
                map.put("dictValue", e.getItemLabel());
                return map;
            })
            .collect(Collectors.toList());
    }

    /**
     * 从值翻译到名称
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     */
    @Override
    public String toName(String dict, Object obj, String name, Object value) {
        if (Objects.isNull(value)) {
            return "";
        }
        DictItem dictItem = dictItemApi.getDictItem(dict, String.valueOf(value));
        if (Objects.isNull(dictItem)) {
            log.warn("dict [{}] code [{}]: name is empty", dict, value);
            return null;
        }
        return dictItem.getItemLabel();
    }

    /**
     * 从名称翻译到值
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     */
    @Override
    public String toValue(String dict, Object obj, String name, Object value) {
        List<DictItem> dictItems = dictItemApi.listDictItem(dict);
        if (CollUtil.isEmpty(dictItems)) {
            log.warn("dict [{}] name [{}]: code is empty", dict, value);
            return null;
        }
        return dictItems.stream().filter(e -> e.getItemLabel().equals(value))
            .findFirst().map(DictItem::getItemValue).orElse(null);
    }
}
